package a

import (
	"server/model/system"

	"github.com/gin-gonic/gin"
	"gorm.io/datatypes"
)

type S流程记录 struct {
	A执行人 *uint `json:"执行人"`
}

type S流程设置 struct {
	A禁止手动流程动作 *bool               `json:"禁止手动流程动作"`
	A允许操作角色   map[string][]string `json:"允许操作角色"`
}

// type S元件 struct {
// 	A名称   string             `json:"名称" gorm:"unique;column:名称;"`
// 	A英文名  string             `json:"英文名" gorm:"column:英文名;备注:;"`
// 	A元件s  []*S元件             `json:"元件s" gorm:"-"`
// 	A图标   string             `json:"图标"`
// 	A标题   string             `json:"标题"`
// 	Amenu system.SysBaseMenu `json:"menu" gorm:"-"`
// }

// func (S元件) TableName() string {
// 	return "a元件"
// }

type S元件 struct {
	A名称   string `json:"名称" gorm:"unique;column:名称;"`
	A英文名  string `json:"英文名" gorm:"column:英文名;备注:;"`
	Aid   string `json:"id"`
	A英文id string `json:"英文id" 备注:"/号分割，go.tpl包路径用到"`
	A父id  string `json:"父id"`
	// A父id  string `json:"父id" 备注:"以_连接，数据表名可用"`

	// A元件名       string             `json:"元件名"`
	// A元件英文名     string             `json:"元件英文名"`
	A表名        string             `json:"表名"`
	Amodel名    string             `json:"-" 备注:"全中文用来生成文件名"`
	Amodel英文名  string             `json:"-" 备注:"开头加上大写字母，作为go结构体"`
	Amodel英文全名 string             `json:"-" 备注:"英文名前面，再加上最末级包名，仅model按元件文件夹分开存储需要用"`
	A包路径       string             `json:"-" 备注:""`
	Amodel包路径  string             `json:"-" 备注:"model相互引用时需要"`
	A标题        string             `json:"标题"`
	A图标        string             `json:"图标"`
	Amenu      system.SysBaseMenu `json:"menu" gorm:"-"`
	Aapi       *Sapi              `json:"-" gorm:"-"`
	A其他api     any                `json:"-"`
	Aservice   *Sservice          `json:"-"`
	Amodel     any                `json:"model"`
	A元件单项模板    map[string]any     `json:"元件单项模板"`
	A列表req     S列表req
	A字段组       []*S字段 `json:"字段组"`
	A子元件s      []*S元件 `json:"子元件s"`
	A元件关联包s    []string
	Amodel关联包s []string
	A权限集       *S权限集       `json:"权限集"`
	A自动挡hook   *S元件自动挡hook `json:"-" gorm:"-"`
	A有自动挡hook  bool        `json:"有自动挡hook"`
	A手动挡       *S元件手动挡     `json:"-" gorm:"-"`
	A有手动挡      bool        `json:"有手动挡"`
	A有看板否      bool        `json:"有看板否"`
	// A树结构       map[string]string `json:"树结构"`
	A树结构       datatypes.JSON `json:"树结构"`
	Acards     datatypes.JSON `json:"cards"`
	A状态候选值     datatypes.JSON `json:"状态候选值"`
	A流程设置      S流程设置          `json:"流程设置"`
	A成候选值字段名组  datatypes.JSON `json:"成候选值字段名组"`
	A多字段搜索字段名s datatypes.JSON `json:"多字段搜索字段名s"`
	A源reqdata  any
}

type S字段 struct {
	A名称    string `json:"名称"`
	A名称go  string `json:"-"`
	A名称sql string `json:"-"`
	A类型    string `json:"类型"`
	A类型_go string `json:"-"`
	A父id   string `json:"父id"`
	// A父id         string         `json:"父id" 备注:"以_连接，数据表名可用"`
	A标题            string         `json:"标题"`
	A详情标题          string         `json:"详情标题"`
	Acards         datatypes.JSON `json:"cards"`
	A插槽            datatypes.JSON `json:"插槽"`
	A图标            string         `json:"图标"`
	A是主键           bool           `json:"是主键"`
	A显示设置          any            `json:"显示设置"`
	A显示设置_独立详情     any            `json:"显示设置_独立详情"`
	A显示设置_主表       any            `json:"显示设置_主表"`
	A显示设置_子表中_独立详情 any            `json:"显示设置_子表中_独立详情"`
	A显示设置_子表中_简化详情 any            `json:"显示设置_子表中_简化详情"`
	A显示设置_子表中_父表内嵌 any            `json:"显示设置_子表中_父表内嵌"`
	A子表显示设置        any            `json:"子表显示设置"`
	A子表显示设置_独立详情   any            `json:"子表显示设置_独立详情"`
	A子表显示设置_简化详情   any            `json:"子表显示设置_简化详情"`
	A子表显示设置_父表内嵌   any            `json:"子表显示设置_父表内嵌"`
	A不展开选型否        bool           `json:"不展开选项否"`
	A是公用字段         bool           `json:"是公用字段"`
	A是唯一值          bool           `json:"是唯一值"`
	A必填            bool           `json:"必填"`
	A默认值           any            `json:"默认值"`
	A默认值_go        string         `json:"-"`
	A备注            string         `json:"备注"`
	A数据长度          string         `json:"数据长度"`
	A表单字段宽         float64        `json:"表单字段宽"`
	A候选值           datatypes.JSON `json:"候选值"`
	A候选值源字段        string         `json:"候选值源字段"`
	A候选值设置         any            `json:"候选值设置"`
	A关联属性          datatypes.JSON `json:"关联属性"`
	Ajoin属性        datatypes.JSON `json:"join属性"`
	A关联元件          *S元件           `json:"关联元件" gorm:"-"`
	// 链接字段 或者 关联字段 中对应关联元件中 的字段👇
	A显示值字段名   string `json:"显示值字段名" gorm:"-"`
	A省略gorm   bool   `json:"-"`
	A不入库      bool   `json:"不入库"`
	A无model   bool   `json:"无model"`
	A有链接      bool   `json:"有链接"`
	A关联包名     string `json:"关联包名"`
	A外键字段名    string `json:"外键字段名"`
	A外键字段名_go string `json:"外键字段名_go"`
	A关联约束     string `json:"关联约束"`
	// A指定外键标签      template.HTML
	// 给外键记录信息用
	A是外键   bool   `json:"是外键"`
	A关联元件名 string `json:"关联元件名"`
	// A关联元件名 string `json:"关联元件名"`
	A组合值唯一 string `json:"组合值唯一"`
}

type S元件手动挡 struct {
	A注册 A注册函数 `json:"-" gorm:"-"`
}

type A注册函数 func(
	PrivateGroup *gin.RouterGroup,
	PublicGroup *gin.RouterGroup,
	engine *gin.Engine,
	父元件 *S元件,
	元件 *S元件,
)

type S元件自动挡hook struct {
	A注册路由 any `gorm:"-"`
	// A注册路由    func(*gin.RouterGroup, *gin.RouterGroup) `gorm:"-"`
	A增s7     any
	A增或改之前s7 any
	A改之前s7   any
	Aservice any
	Ajoin    any
	A增       any
}

type S权限集 struct {
	A全公开 bool `json:"全公开"`
	A增   *S权限 `json:"增"`
}

type S权限 struct {
	A公开 bool           `json:"公开"`
	A角色 datatypes.JSON `json:"角色配置"`
}

// func 根据权限处理api(PrivateGroup *gin.RouterGroup, PublicGroup *gin.RouterGroup, 元件 *S元件, api Sapi, 关键词 string) {
//     公开否:=
// 	if 元件.A权限集.A增.A公开 {
// 		PublicGroup.POST("", api.A增)
// 	} else {
// 		PrivateGroup.POST("", api.A增)
// 	}
// }
